package services

import (
	"errors"
	"yuanaiproblem/dao"
	models "yuanaiproblem/dao/model"
	"yuanaiproblem/models/dto"

	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

// CreateUser 管理员创建用户
// 入参：用户名、密码
// 流程：检查用户名唯一性 -> 加密密码 -> 创建用户记录 -> 返回新用户信息
func CreateUser(username, password string) (*models.User, error) {
	// 检查用户名是否已存在
	exists, err := dao.IsUsernameExists(username)
	if err != nil {
		return nil, err // 传递查询错误
	}
	if exists {
		// 用户名冲突错误
		return nil, errors.New("用户名已存在")
	}

	// 加密密码
	hashedPassword, err := bcrypt.GenerateFromPassword(
		[]byte(password),
		bcrypt.DefaultCost, // 使用默认加密强度
	)
	if err != nil {
		// 明确密码处理错误
		return nil, errors.New("密码加密失败: " + err.Error())
	}

	// 构造新用户数据-默认角色为普通用户
	newUser := models.User{
		Username:     username,
		PasswordHash: string(hashedPassword), // 存储加密后的密码
		Role:         "user",
	}

	// 调用DAO创建用户记录
	if err := dao.CreateUser(&newUser); err != nil {
		return nil, errors.New("创建用户失败: " + err.Error()) // 明确创建失败错误
	}

	// 返回创建成功的用户信息
	return &newUser, nil
}

// DeleteUser 管理员删除用户
// 入参：目标用户ID
// 流程：验证目标用户存在性 -> 检查是否为管理员（禁止删除） -> 执行删除 -> 返回结果
func DeleteUser(userID int32) error {
	// 验证目标用户是否存在
	user, err := dao.GetUserByID(userID)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return errors.New("用户不存在") // 明确"用户不存在"错误
		}
		return errors.New("查询用户失败: " + err.Error()) // 其他查询错误包装
	}

	// 禁止删除管理员用户
	if user.Role == "admin" {
		return errors.New("禁止删除管理员用户")
	}

	// 执行删除操作
	if err := dao.DeleteUser(user); err != nil {
		return errors.New("删除用户失败: " + err.Error()) // 包装删除失败错误
	}

	// 删除成功，无返回值
	return nil
}

// GetAll 分页查询所有题目
func GetAllQuestionsByAdmin(page, pageSize int) (map[string]interface{}, error) {
	return dao.GetAllQuestionsByAdmin(page, pageSize)
}

// GetByID 查询单个题目
func GetQuestionsByID(id int) (*models.Question, error) {
	return dao.GetQuestionByID(uint(id))
}

// GetUserStats 获取用户维度统计
func GetUserStats(userID string) (*dto.UserStatsResponse, error) {
	stats, err := dao.GetUserStats(userID)
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	return stats, nil
}

// GetSystemStats 获取系统维度统计
func GetSystemStats() (*dto.SystemStatsResponse, error) {
	return dao.GetSystemStats()
}
